﻿#region Copyright and License Notice
// Copyright (C)2010-2016 - Rob Levine and other contributors
// http://configgen.codeplex.com
// 
// This file is part of ConfigGen.
// 
// ConfigGen is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
// 
// ConfigGen is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
// 
// You should have received a copy of the GNU General Public License and 
// the GNU Lesser General Public License along with ConfigGen.  
// If not, see <http://www.gnu.org/licenses/>
#endregion

using System;
using System.Linq;
using ConfigGen.ConsoleApp.Core.CommandLineOptionCore;
using ConfigGen.ConsoleApp.Core.CommandLineOptions;
using NUnit.Framework;

namespace ConfigGen.ConsoleApp.Core.Tests.CommandLineOptions
{
    [TestFixture]
    public class ConfigGenCommandLineOptionFactoryTests
    {
        [Test]
        public void AssertAllCommandLineOptionsAreLoadedByFactory()
        {
            var assembly = typeof(ConfigGenCommandLineOptionFactory).Assembly;

            var options = (from type in assembly.GetTypes()
                           where !type.IsInterface
                               && !type.IsAbstract
                               && typeof(ICommandLineOption<ConsoleAppPreferences>).IsAssignableFrom(type)
                           select (ICommandLineOption<ConsoleAppPreferences>)type.GetConstructor(Type.EmptyTypes).Invoke(null)).ToList();

            var factory = new ConfigGenCommandLineOptionFactory();

            foreach (ICommandLineOption<ConsoleAppPreferences> option in options)
            {
                Assert.IsTrue(factory.LoadedHandlers.FirstOrDefault(h => h.GetType() == option.GetType()) != null,
                                 "Option \"" + option.GetType().Name + "\" not loaded in factory");
            }
        }
    }
}
